The evolution of graphics rendering technology has led to the development of procedural techniques for describing various steps in the rendering process. Procedural geometry is useful as a mechanism for producing arbitrarily complex geometry from compact descriptions. For a simple example, a cube object can be represented passively, as a polygonal representation comprising a list of eight vertexes and six sides. However, a more-compact, procedural representation can be developed where the cube becomes the result of a cube-generating procedure, which needs as input only position coordinates and a size. Thus, geometric procedures often provide a useful, compact way to represent shapes, avoiding the access and transfer of many points of data. More complex procedures, such as rotations or splines, offer even greater compression of data. Other processes, such as shading and texture also take advantage of procedural techniques. Indeed, programmable procedural shaders are seen by some as the most efficient way to represent complex material properties.
However, conventional graphics display or graphics processor unit (“GPU”) architectures enforce a divide between procedural geometry and procedural appearance (such as procedural shaders and texture) by means of a processing chain that operates on fixed, passive polygonal primitives. A common approach is to relegate procedural geometry to the prerasterization stages, to expand the procedures into polygons, and to devote a large amount of bandwidth to feeding polygons to the transformation and setup stages of the graphics processor.
One example of these traditional techniques is shown in FIG. 1, which illustrates a simplified overview of a traditional GPU architecture. A display list 100, which may contain a combination of passively described geometry and procedural geometry, is input into vertex shaders 110, which generate polygonal representations of the geometric forms. These geometric forms are then input into a rasterizer, which interpolates the polygons and samples them to develop a sample set of points in image space, which can then be shaded and have texture added to them. These points are then passed to a series of pixel shaders 130, which may or may not be programmable, and which utilize parallel computing techniques to perform shading of the points. Additionally, the pixel shaders will sometimes add textures, which are kept in graphics memory 150 and cached in texture cache 140, to the image points. Once these processes are complete, the image points can then be placed in a frame-buffer 160 before being transferred to graphics memory 150.
However, as mentioned above, because geometric procedures are converted into polygons and then into a list of points in an image by the rasterizer, compact procedural graphics information tends to be compromised early-on in lieu of expanded sets of surface points. This can be beneficial when processing power is so low that it is desirable, from a resource and time perspective, to compute geometric procedures only once for each shape. However, as GPU processors are ever-increasing in power and efficiency, these processing concerns become smaller and smaller.